package admin_api

import (
	"software/core"
	"software/global"
	"software/models"
	"software/models/res"
	"software/service"
	"strconv"

	"github.com/gin-gonic/gin"
	"golang.org/x/crypto/bcrypt"
)

func (a AdminsApi) AdminsInfoViewById(c *gin.Context) {
	// 从上下文中获取管理员ID（通过JWT中间件设置）
	userID, exists := c.Get("user_id")
	if !exists {
		res.FailWithMsg("未找到管理员ID", c)
		return
	}

	// 由于JWT中间件已经处理了类型转换，这里直接使用
	adminID := userID.(uint)

	// 调用服务层查询管理员信息（不含密码）
	adminInfo, err := service.QueryAdminInfoById(adminID)
	if err != nil {
		res.FailWithMsg(err.Error(), c)
		return
	}

	res.OKWithData(adminInfo, c)
}

func (a AdminsApi) AdminsListView(c *gin.Context) {
	users, err := service.QueryAllAdmins()
	if err != nil {
		res.FailWithMsg(err.Error(), c)
		return
	}
	res.OKWithData(users, c)
}

func (a AdminsApi) CreateAdminsView(c *gin.Context) {
	var user models.Admin
	if err := c.ShouldBindJSON(&user); err != nil {
		res.FailWithMsg("请求数据格式错误: "+err.Error(), c)
		return
	}

	// 调用服务层创建用户
	err := service.CreateAdmin(&user)
	if err != nil {
		res.FailWithMsg(err.Error(), c)
		return
	}

	res.OKWithData(user, c)

}

// 更新用户信息
func (a AdminsApi) UpdateAdminsView(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 64)
	if err != nil {
		res.FailWithMsg("无效的用户 ID", c)
		return
	}

	// 解析请求体
	var updateData map[string]interface{}
	if err := c.ShouldBindJSON(&updateData); err != nil {
		res.FailWithMsg("请求参数错误", c)
		return
	}

	// 调用服务层更新用户
	err = service.UpdateAdminById(uint(id), updateData)
	if err != nil {
		res.FailWithMsg(err.Error(), c)
		return
	}

	res.OKWithMsg("用户信息更新成功", c)
}

func (a AdminsApi) DeleteAdminsView(c *gin.Context) {
	id := c.Param("id") // 获取路径参数 :id

	// 调用服务层删除用户
	err := service.DeleteAdmin(id)
	if err != nil {
		res.FailWithMsg(err.Error(), c)
		return
	}

	res.OKWithMsg("用户删除成功", c)

}

// Login 用户登录
func (a AdminsApi) Login(c *gin.Context) {
	var admin models.Admin

	// 绑定请求数据到 admin 结构体
	if err := c.ShouldBindJSON(&admin); err != nil {
		res.FailWithMsg("无效输入", c)
		return
	}

	// 检查用户名是否为空
	if admin.Username == "" {
		res.FailWithMsg("用户名为空", c)
		return
	}

	// 查询用户
	dbAdmin, err := service.QueryAdminByUsername(admin.Username)
	if err != nil {
		res.FailWithMsg("用户名或密码不正确", c)
		return
	}

	// 验证密码
	err = bcrypt.CompareHashAndPassword([]byte(dbAdmin.Password), []byte(admin.Password))
	//global.Log.Infof("用户输入密码: %s", admin.Password)
	//global.Log.Infof("数据库存储密码: %s", dbAdmin.Password)
	if err != nil {
		global.Log.Errorf("密码验证失败: %v", err)
		res.FailWithMsg("用户名或密码不正确", c)
		return
	}

	// 生成JWT
	token, err := core.GenerateToken(dbAdmin.ID, dbAdmin.Username)
	if err != nil {
		res.FailWithMsg("生成token失败", c)
		return
	}

	// 构造管理员响应数据
	adminResponse := gin.H{
		"id":       dbAdmin.ID,
		"username": dbAdmin.Username,
		//"password": dbAdmin.Password,
		"avatar":     dbAdmin.Avatar,
		"created_at": dbAdmin.CreatedAt.Format("2006-01-02 15:04:05"), // 自定义时间格式化
		"gender":     dbAdmin.Gender,
		"phone":      dbAdmin.Phone,
		"email":      dbAdmin.Email,
		"profile":    dbAdmin.Profile,
	}

	// 返回JWT和管理员信息
	res.OKWithData(gin.H{
		"token": token,
		"admin": adminResponse,
	}, c)
}

// ChangePasswordView 修改管理员密码
func (a AdminsApi) ChangePasswordView(c *gin.Context) {
	// 从上下文中获取管理员ID
	userID, exists := c.Get("user_id")
	if !exists {
		res.FailWithMsg("未找到管理员ID", c)
		return
	}

	// 由于JWT中间件已经处理了类型转换，这里直接使用
	adminID := userID.(uint)

	// 绑定请求体中的 JSON 数据
	var req struct {
		OldPassword string `json:"old_password" binding:"required"`
		NewPassword string `json:"new_password" binding:"required,min=6"`
	}
	if err := c.ShouldBindJSON(&req); err != nil {
		res.FailWithMsg("请求参数错误", c)
		return
	}

	// 调用服务层修改密码
	err := service.ChangeAdminPassword(adminID, req.OldPassword, req.NewPassword)
	if err != nil {
		res.FailWithMsg(err.Error(), c)
		return
	}

	res.OKWithMsg("密码修改成功", c)
}

// Logout 管理员退出登录
func (a AdminsApi) Logout(c *gin.Context) {
	// 从上下文中获取管理员ID
	userID, exists := c.Get("user_id")
	if !exists {
		res.FailWithMsg("未找到管理员ID", c)
		return
	}

	// 由于JWT中间件已经处理了类型转换，这里直接使用
	adminID := userID.(uint)

	// 记录退出登录日志
	global.Log.Infof("管理员 ID:%v 退出登录", adminID)

	// 返回成功响应
	res.OKWithMsg("退出登录成功", c)
}

// UpdateAdminProfileView 更新当前管理员的个人资料
func (a AdminsApi) UpdateAdminProfileView(c *gin.Context) {
	// 从上下文中获取管理员ID
	userID, exists := c.Get("user_id")
	if !exists {
		res.FailWithMsg("未找到管理员ID", c)
		return
	}

	// 由于JWT中间件已经处理了类型转换，这里直接使用
	adminID := userID.(uint)

	// 解析请求体
	var updateData map[string]interface{}
	if err := c.ShouldBindJSON(&updateData); err != nil {
		res.FailWithMsg("请求参数错误", c)
		return
	}

	// 安全性检查：确保不能修改关键字段
	delete(updateData, "id")
	delete(updateData, "phone")
	delete(updateData, "password")
	delete(updateData, "created_at")

	// 调用服务层更新管理员信息
	err := service.UpdateAdminById(adminID, updateData)
	if err != nil {
		res.FailWithMsg(err.Error(), c)
		return
	}

	// 获取更新后的管理员信息
	adminInfo, err := service.QueryAdminInfoById(adminID)
	if err != nil {
		res.FailWithMsg("获取更新后的管理员信息失败", c)
		return
	}

	res.OKWithData(adminInfo, c)
}
